package com.abel.bigwater.data.jnrq

import com.abel.bigwater.data.BcdString
import io.netty.buffer.ByteBuf

class DownloadAddrData : JnrqData() {
    companion object {
        val bak1 = byteArrayOf(0, 0)

    }

    var totalPackageCount: Int? = null

    var packageIndex: Int? = null

    var meterCountInPackage: Int? = null

    var channelPort: Int = 0

    var relayAddr1 = byteArrayOf(0, 0, 0, 0)

    var relayAddr2 = byteArrayOf(0, 0, 0, 0)

    var relayPort = 0

    /**
     * 备用 2
     * PL1H PL2H PH1H PH2H BAH PAH XXH
     * 备用 2 为备选字节，除以下情况内默认为 00H,
    ⑴、 有压力传感器的情况， PL1H、 PL2H 表示压力下限报警值， PH1H、 PH2H 为压力上
    限报警值，
    ⑵、 强制抄表波特率的情况， BAH 表示执行的抄表波特率/100，如 BA = 24，则波特率 =
    2400， PAH 表示校验位， 1 无校验 NONE,2 偶校验 EVEN,3 奇校验 ODD,4 MARK,5 SPACE
     */
//    var bak2: ByteArray? = null

    var pressureLowLimit: Int = 0

    var pressureHighLimint: Int = 0

    var bpsByte: Short = 0

    var checkByte: Short = 0

    var bak2Last: Short = 0

    /**
     * 地址列表： N 为表的个数， N = 此帧中的“本包表数”， 8*XXH 为每块表的 8 字节地址，
    传输循序从低字节都高字节,N 最大值 60。
     */
    var meterList: ArrayList<BcdString>? = null


    /**
     * 计算数据长度，针对解析和打包
     */
    override fun computeDataLen(): Int {
        dataLen = 2 + 1 + 1 + 1 + 1 + 4 + 4 + 1 + 7 + 8 * meterList!!.count()

        return dataLen!!
    }

    /**
     * 从当前位置写入打包字节流
     */
    override fun fillBuffer(buf: ByteBuf) {
        val tmp = buf.alloc().buffer().apply {
            writeBytes(bak1)

            writeByte(totalPackageCount!!)

            writeByte(packageIndex!!)

            writeByte(meterCountInPackage!!)

            writeByte(channelPort)

            writeBytes(relayAddr1).writeBytes(relayAddr2)

            writeByte(relayPort)

            // 备用 2
            writeShortLE(pressureLowLimit)

            writeShortLE(pressureHighLimint)

            writeByte(bpsByte.toInt())

            writeByte(checkByte.toInt())

            writeByte(bak2Last.toInt())

            // 地址列表
            meterList!!.forEach { writeBytes(it.hexArray) }
        }

        buf.writeBytes(tmp)
    }

    /**
     * 解析字节流，从buf当前位置开始，并且消费其中的字节。
     */
    override fun parseBuffer(buf: ByteBuf) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}